IA64FAULT vector;
struct domain *d = current->domain;
struct vcpu *v = current;
- // FIXME: no need to pass itir in to this routine as we need to
- // compute the virtual itir anyway (based on domain's RR.ps)
- // AND ACTUALLY reflect_interruption doesn't use it anyway!
vector = priv_emulate(current,regs,isr);
if (vector != IA64_NO_FAULT && vector != IA64_RFI_IN_PROGRESS) {
- PSCB(current,itir) =
- vcpu_get_itir_on_fault(v,PSCB(current,ifa));
+ // Note: if a path results in a vector to reflect that requires
+ // iha/itir (e.g. vcpu_force_data_miss), they must be set there
reflect_interruption(isr,regs,vector);
}
}
IA64FAULT vcpu_force_data_miss(VCPU *vcpu, UINT64 ifa)
{
PSCB(vcpu,ifa) = ifa;
+ PSCB(vcpu,itir) = vcpu_get_itir_on_fault(vcpu,ifa);
+ vcpu_thash(current, ifa, &PSCB(current,iha));
return (vcpu_get_rr_ve(vcpu,ifa) ? IA64_DATA_TLB_VECTOR : IA64_ALT_DATA_TLB_VECTOR);
}